R語言簡介及基本功能函數

林嶔 (Lin, Chin)

Lesson 1

課程介紹

  1. 『進階資料視覺化及建立網頁App』的課程著重於前端開發,讓自己的程式能分享給其它不懂程式語言的人使用。

  2. 『演算法及機器學習』的課程則著重於後端工程,藉由了解資料科學的原理及應用,讓同學有能力開發自己的人工智慧系統。

為什麼是R?

  1. R有非常先進的數據視覺化系統

  2. R有很多進階數據分析工具

  3. R是完整的資料科學解決方案

F1_1

– 與其他統計軟體相比,R語言更接近程式語言,因此在熟悉以後更能建立自己的常規工作pipeline,加快自己的工作效率。

– 與其他程式語言相比,R語言更專注在統計分析功能的開發上,因此相關的功能較完善,比較容易找到合適的函數進行運算。

開始的第一步:安裝R語言

F1_2

第一節:將R作為一個計算機(1)

– 請試著在左邊的Console視窗中,輸入下列程式碼,並體會他的計算功能

# 四則運算
123 + 489
145 * 12

# 括弧優先規則
(1 + 2) * 3

# 指數、對數運算
12^4
exp(2)
sqrt(10)
log(3)
log(3, 3)

第一節:將R作為一個計算機(2)

– 註:物件的屬性有很多種,待會我們再一一介紹

– 注意,等號的右邊為「input」,等號的左邊為「output」

x = 2 * 2 * 3
x
print(x)
x/4

第一節:將R作為一個計算機(3)

– 函數「c()」中間以逗點為界,此函數可以將不同「物件」合併在同一個物件內

– 注意,以後看到所有文字後馬上連接小括號,都代表著這是一串函數,小括號的內容代表著該函數的「input」,不同函數有不同的「input」,使用時請注意函數的說明內容

x = c(1, 2, 3, 4, 5)
x
x^3
x = c(1, 2, 3, 4, 5)
y = c(6, 7, 9, 8, 10)
y - x
x * y

第二節:熟悉R裡面的基本物件(1)

  1. 變數(Variable)層:邏輯(logical)向量、整數(integer)向量、因子(factor)向量、數字(numeric)向量、文字(character)向量

  2. 陣列(Array)層:矩陣(matrix)、資料表(data.frame)

  3. 列表(List)層:列表(list)、S3物件(S3 class)、S4物件(S4 class)

– 函數「as.XXX()」可以強迫某個向量內所有的內容全部轉換為該種類

– 函數「class()」可以查詢該物件的屬性

a = c(TRUE, FALSE, TRUE, FALSE)
class(a)

b = c(1, 2, 3, 4, 5)
class(b)
b1 = as.integer(b)
class(b1)

c = c(0.7, -0.9, 1.2, -2.1, 3.7)
c1 = as.integer(c)
c1

d = c("A", "B", "C", "C", "B")
class(d)
d1 = as.factor(d)
d1

e = c(c, d)
e
class(e)

e1 = c(c1, d1)
e1
class(e1)

第二節:熟悉R裡面的基本物件(2)

  1. 函數「length()」可以查詢該向量的長度

  2. 函數「levels()」可以查詢因子向量的類別種類

d = c("A", "B", "C", "C", "B")
class(d)
d1 = as.factor(d)
d1

n = length(d1)
n

categories = levels(d1)
categories
categories = levels(d1)
n.categories = length(categories)
n.categories

# 用下列這串意思一樣
n.categories = length(levels(d1))
n.categories

第二節:熟悉R裡面的基本物件(3)

y = c(6, 7, 9, 8, 10)
y[1]
y[c(3, 5)]
y[6]
y[7] = 3 * 5
y
y[3] = -1
y
y[3] = y[1] + y[2]
y[6] = y[4] * y[5]
y

練習1:運算及變數索引功能

– 註,每個人的X不一樣(以下範例數字為3的範例),由老師指定

## [1]   1   3   4  12  16 192 208

練習1答案

y = c(1, 3)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y
## [1]   1   3   4  12  16 192 208
y = c(1, 3)

i = 1
y[i+2] = y[i] + y[i+1]
i = 2
y[i+2] = y[i] * y[i+1]
i = 3
y[i+2] = y[i] + y[i+1]
i = 4
y[i+2] = y[i] * y[i+1]
i = 5
y[i+2] = y[i] + y[i+1]

y
## [1]   1   3   4  12  16 192 208

第三節:條件判斷式(1)

1 < 2
2 == 1 + 1
"Z" > "B"
x = c(1, 2, 3, 4, 5)
x <= 4
x > 2
x = c(1, 2, 3, 4, 5)
x <= 4 & x > 2
x > 4 | x <= 2

第三節:條件判斷式(2)

if ("Z" > "B") {x = 2} else {x = 5}
if ("利" > "弊") {y = 3} else {y = 4}
x * y

– 答案是不行的,因為函數「if」的括弧內僅能包含「一個」邏輯值(請同學試試)

x = c(1, 2, 3, 4, 5)
x[x <= 4 & x > 2] = -1
x

第四節:迴圈(1)

– 在這裡我們需要兩個物件:物件「x」為儲存費波納奇數列的物件,而物件「indexes」代表著隨迴圈變化的物件

x = c(1, 1)
indexes = 3:20

for (i in indexes) {
  x[i] = x[i-1] + x[i-2]
}

x
##  [1]    1    1    2    3    5    8   13   21   34   55   89  144  233  377
## [15]  610  987 1597 2584 4181 6765

第四節:迴圈(2)

i = 3 #物件「indexes」中的第一個數字
x[i] = x[i-1] + x[i-2]
i = 4 #物件「indexes」中的第二個數字
x[i] = x[i-1] + x[i-2]
i = 20 #物件「indexes」中的最後一個數字
x[i] = x[i-1] + x[i-2]

第四節:迴圈(3)

– 函數「cat」的功能是將文字前後連接起來並輸出在Console視窗中

students = c("小華", "小明", "小王")
scores = c(100, 80, 70)

for (i in 1:3) {
  cat(students[i], "的考試成績為", scores[i], "分\n")
}
## 小華 的考試成績為 100 分
## 小明 的考試成績為 80 分
## 小王 的考試成績為 70 分

練習2:將練習1的題目用迴圈來執行

– 註,每個人的X不一樣(以下範例數字為1的範例),由老師指定

y = c(1, 1)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y[8] = y[6] * y[7]
y[9] = y[7] + y[8]
y[10] = y[8] * y[9]
y
##  [1]     1     1     2     2     4     8    12    96   108 10368

練習2答案(1)

y = c(1, 1)

i = 1
y[i+2] = y[i] + y[i+1]
i = 2
y[i+2] = y[i] * y[i+1]
i = 3
y[i+2] = y[i] + y[i+1]
i = 4
y[i+2] = y[i] * y[i+1]
i = 5
y[i+2] = y[i] + y[i+1]
i = 6
y[i+2] = y[i] * y[i+1]
i = 7
y[i+2] = y[i] + y[i+1]
i = 8
y[i+2] = y[i] * y[i+1]

y
y = c(1, 1)

for (i in 1:8) {
  if (i == '奇數') {
    y[i+2] = y[i] + y[i+1]
  } else {
    y[i+2] = y[i] * y[i+1]
  }
}

y

練習2答案(2)

y = c(1, 1)

for (i in 1:8) {
  if (as.integer(i/2) == i/2) {
    y[i+2] = y[i] + y[i+1]
  } else {
    y[i+2] = y[i] * y[i+1]
  }
}

y
y = c(1, 1)

for (i in 1:8) {
  if ((-1)^i == -1) {
    y[i+2] = y[i] + y[i+1]
  } else {
    y[i+2] = y[i] * y[i+1]
  }
}

y
y = c(1, 1)

for (i in 1:8) {
  if (i %% 2 == 1) {
    y[i+2] = y[i] + y[i+1]
  } else {
    y[i+2] = y[i] * y[i+1]
  }
}

y

練習2答案(3)

– 這個解法的關鍵在於,我們需要改變我們的索引數:

y = c(1, 1)

i = 1
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
i = 2
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
i = 3
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
i = 4
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]

y
y = c(1, 1)

for (i in 1:4) {
  y[2*i+1] = y[2*i-1] + y[2*i]
  y[2*i+2] = y[2*i] * y[2*i+1]
}

y

第五節:自訂函數(1)

a = 2
b = 4
x = c(a, b)
indexes = 3:20

for (i in indexes) {
  x[i] = x[i-1] + x[i-2]
}

x
##  [1]     2     4     6    10    16    26    42    68   110   178   288
## [12]   466   754  1220  1974  3194  5168  8362 13530 21892
Fibonacci = function (a, b) {
  x = c(a, b)
  indexes = 3:20

  for (i in indexes) {
    x[i] = x[i-1] + x[i-2]
  }

  x
}
Fibonacci(2, 4)
##  [1]     2     4     6    10    16    26    42    68   110   178   288
## [12]   466   754  1220  1974  3194  5168  8362 13530 21892

第五節:自訂函數(2)

Fibonacci = function (a, b, length) {
  x = c(a, b)
  indexes = 3:length

  for (i in indexes) {
    x[i] = x[i-1] + x[i-2]
  }

  x
}
Fibonacci(2, 4, 10)
##  [1]   2   4   6  10  16  26  42  68 110 178

第五節:自訂函數(3)

Fibonacci(2, 4, 2)
Fibonacci = function (a, b, length) {
  if (length < 3) {cat("length必須大於等於3。")} else {
      x = c(a, b)
      indexes = 3:length

      for (i in indexes) {
        x[i] = x[i-1] + x[i-2]
      }
      
      x
  }
}
Fibonacci(2, 4, 2)
## length必須大於等於3。

練習3:將練習2的題目打包成像剛剛的函數

  1. 可指定任兩個起始數値
  2. 可選擇列印長度
  3. 若長度小於3,必須給警告
  4. 若輸入的長度數値非「整數」,先將其轉為「整數」後再進行運算
y = c(1, 1)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y[8] = y[6] * y[7]
y[9] = y[7] + y[8]
y[10] = y[8] * y[9]
y
##  [1]     1     1     2     2     4     8    12    96   108 10368

練習3答案

NDMC_func = function (a, b, length) {
  if (length < 3) {cat("length必須大於等於3。")} else {
      x = c(a, b)
      indexes = 3:as.integer(length)
      for (i in indexes) {
        if ((-1)^i == -1) {
          x[i] = x[i-1] + x[i-2]
        } else {
          x[i] = x[i-1] * x[i-2]
        }
      }
      x
  }
}

NDMC_func(a = 1, b = 1, length = 8)
## [1]  1  1  2  2  4  8 12 96

R語言簡介及基本功能函數總結

– 我們已經學到下列功能,這些功能對於往後的應用都相當重要:

  1. 計算功能
  2. for迴圈
  3. 自訂函數